package com.gaoqi.springboot_shiro.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.TokenExpiredException;
import com.auth0.jwt.interfaces.DecodedJWT;
import org.springframework.stereotype.Component;

import java.util.Calendar;
import java.util.Map;

/**
 * 自定义JWT工具类
 */
public class JWTUtils {

    //设置 签名字符串
    private static final String sign = "#$%&^%&4(@!";

    /**
     * 获取token
     */
    public static String getToken(Map<String, String> info) {

        //获取builder 对象
        JWTCreator.Builder builder = JWT.create();

        //创建 calendar 实例对象
        Calendar instance = Calendar.getInstance();
        instance.add(Calendar.SECOND, 10);

        //设置头部信息可以省略

        //设置负载信息  遍历map lambda 表达式
        info.forEach((k, v) -> {
            builder.withClaim(k, v);
        });

        //设置过期时间
        String token = builder.withExpiresAt(instance.getTime())
                //设置签名
                .sign(Algorithm.HMAC256(JWTUtils.sign));

        //返回token 字符串
        return token;
    }


    /**
     * 验证签名 并获取 解码对象  如果验证签名失败 会抛出异常
     */
    public static DecodedJWT testSign(String token) {

        try {
            //获取令牌验证对象 传入签名编码类型以及签名字符串
            JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(sign)).build();
            //对生成的令牌进行解码   获取解码后的对象
            DecodedJWT verify = jwtVerifier.verify(token);
            return verify;
        } catch (TokenExpiredException e) {
            e.printStackTrace();
            System.out.println("***************签名验证失败！！！");
        }
        return null;
    }
}
